package com.yzwu.lambda;

/**
 * @author yzwu
 * @date 2022/5/28 10:41 AM
 */

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;
//todo 基本语法

/**
 * Java8中引入了一个新的操作符"->" 该操作符称为箭头操作符或Lambda操作符，箭头操作符将Lambda表达式拆分成两部分：
 * 左侧：Lambda 表达式的参数列表.对于接口来说，左侧就是接口内方法的参数
 * 右侧：Lambda 表达式中所需执行的功能，即 Lambda 体、对于接口来说，右侧就是对接口内方法的具体实现
 *
 * 语法格式一：无参数，无返回值
 *          ()->System.out.println(“Hello Lambda!”);
 * 语法格式二：有一个参数，并且无返回值
 *          (x)->System.out.println(x);
 * 语法格式三：若只有一个参数，小括号可以不写
 *          x->System.out.println(x);
 * 语法格式四：有两个以上的参数，有返回值，并且Lambda体中有多条语句
 *          Comparator<Integer> com=(x, y)->{
 *             System.out.println("函数式接口");
 *             return Integer.compare(x, y);
 *         };
 * 语法格式五：若Lambda体中只有一条语句，大括号和 return 都可以省略不写
 *          Comparator<Integer> com=(x,y)->Integer.compare(x, y);
 * 语法格式六：Lambda表达式的参数列表的数据类型可以省略不写，因为JVM编译器通过上下文推断出，数据类型，即“类型推断”
 *          (Integer x,Integer y)->Integer.compare(x,y);
 */
public class Lambda1 {
    @Test
    public void test1(){
        final int num = 0; //同级别变量不能进行改变，都是final，可以省略关键字
        //通过匿名内部类的方式实现接口
        Runnable r=new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello World!" + num);
            }
        };
        r.run();

        System.out.println("----------------------");
        //匿名内部类用代替匿名内部类
        Runnable r1=()->System.out.println("Hello Lambda!");
        r1.run();
    }
    @Test
    public void test2(){
        Consumer<String> con=(x)->System.out.println(x);//对Consumer接口中有一个参数的accept方法的实现
        con.accept("啦啦啦");
    }
    @Test
    public void test3(){
        Comparator<Integer> com=(x, y)->{
            System.out.println("函数式接口");
            return Integer.compare(x, y);
        };
    }
    @Test
    public void test4(){
        Comparator<Integer> com = (x,y)->Integer.compare(x, y);
    }

    //需求:对一个数进行运算，lamda精髓就是，从新建一个类---->匿名类---->接口传参---->利用lambda实现接口入参---->达到灵活复用目的
    @Test
    public void  test6(){
        Integer num=operation(100, (x)->x*x);
        System.out.println(num);

        System.out.println(operation(200, (y)->y+200));
    }

    public Integer operation(Integer num,MyFun mf){
        return mf.getValue(num);
    }

}
